package cn.whitecao.agent.core.model;




import cn.whitecao.agent.core.utils.IDGenerator;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;

/**
 * 采集数据的实体类
 *
 * @author Bashful Huang
 * @since 2020-09-11
 **/
@Data
public class Span {
    /**
     * 采集的数据类型
     */
    private String type;
    /**
     * 轨迹id
     */
    private String traceId;

    private String spanId;

    private String parentSpanId;

    /**
     * 执行时间
     */
    private Long duration;
    /**
     * 开始时间,用于统计运行时间,如servlet jdbc http之类的外部调用
     * 但并不是所有都需要统计运行时间如 资源信息 jvm信息等
     */
    private Long startTime;
    /**
     * 结束时间
     */
    private Long endTime;

    /**
     * 调用序号
     */
    private Integer sequenceNumber;
    /**
     * 服务名
     */
    private String appName;
    /**
     *
     */
    private Map<String,Object> dataItems;

    public static class DataType{
        public final static String JVM="JVM";
        public final static String HARDWARE_STATUS="HARDWARE_STATUS";
        public final static String SERVLET="SERVLET";
        public final static String SQL="SQL";
    }

    /**
     * 每次都随机生成一个span 如果不是链路的首个需要取到parentSpanId
     * @param type 类型
     */
    public Span(String type) {
        this.type = type;
        //考虑是否使用线程安全的map
        this.dataItems=new HashMap<>();
        this.startTime=System.currentTimeMillis();
        this.spanId= IDGenerator.getId();
    }

    public void addData(String key,Object value){
        this.dataItems.put(key,value);
    }

    public void calculateExecutionTime(){
        this.endTime=System.currentTimeMillis();
        this.duration=endTime-startTime;
    }
}